前一天探究了 App 其中之一的技術債-管理者修改可能被 CSV 重新匯入覆蓋,這帶出了今天要正式進入到的主題--「管理者功能線」。
今天要讀的檔案是 LoginActivity.kt,顧名思義就是登入功能,當初我們小組是利用輸入帳號密碼的方式來進入管理者功能。然而,因為當初設計較粗略,不能說有足夠的保護。登入功能還需要考慮哪些點?今天就讓我們一探究竟。
一開始我們組內其實是在完成管理者功能後,才發現還沒有設計進入這項功能的入口。因此,我們想說:那就直接在首頁加上按鈕,當管理者登入時,就可以操作管理者裡面的功能。
不過因為當初沒有想太多,我們其實是直接把帳號密碼用硬編碼寫在程式碼裡面,但其實這個方法是不太安全的。
| UI 畫面 | 操作流程 |
|---|---|
![]() |
![]() |
LoginActivity.kt 負責什麼和 Hermes Agent 一起重讀 LoginActivity.kt 後,我知道它是管理者功能的入口,負責顯示登入頁、取得帳密、驗證帳密、登入成功後記錄狀態、跳轉到 ManagerActivity(管理者功能)、登入失敗顯示錯誤。
程式碼中的核心邏輯有以下:
private val ADMIN_USER = "xxxx"
private val ADMIN_PASS = "xxxx"
ADMIN_USER 是帳號,ADMIN_PASS 是密碼,以硬編碼的方式寫死setContentView(R.layout.activity_login)
val etUsername = findViewById<EditText>(R.id.etUsername)
val etPassword = findViewById<EditText>(R.id.etPassword)
val btnLogin = findViewById<Button>(R.id.btnLogin)
val btnExit = findViewById<Button>(R.id.btnExit)
activity_login.xml 設為畫面,並取得帳號輸入框、密碼輸入框、登入按鈕與離開按鈕。btnLogin.setOnClickListener {
val user = etUsername.text.toString()
val pass = etPassword.text.toString()
if (user == ADMIN_USER && pass == ADMIN_PASS) {
val pref = getSharedPreferences("LoginData", Context.MODE_PRIVATE)
pref.edit().putBoolean("isLoggedIn", true).apply()
Toast.makeText(this, "登入成功", Toast.LENGTH_SHORT).show()
goToManagerPage()
} else {
Toast.makeText(this, "帳號或密碼錯誤", Toast.LENGTH_SHORT).show()
}
}
private fun goToManagerPage() {
val intent = Intent(this, ManagerActivity::class.java)
startActivity(intent)
finish()
}
ManagerActivity,並用 finish() 關閉登入頁,避免使用者按返回又回到 LoginActivity。MainActivity
↓
點擊「管理」
↓
LoginActivity
↓
顯示管理者登入頁
↓
輸入帳號 / 密碼
↓
驗證登入資訊
↓
驗證成功?
├── 否 → 顯示 Toast
│
└── 是
↓
isLoggedIn = true
↓
ManagerActivity
↓
進入管理者功能
LoginActivity 是 RoomRush 管理者功能的入口頁。
MainActivity 的 Manage 按鈕進入登入頁後,程式會讀取帳號與密碼輸入框的文字,並與硬編碼的 ADMIN_USER、ADMIN_PASS 比對。SharedPreferences 在 LoginData 中寫入 isLoggedIn = true,顯示登入成功提示,然後開啟 ManagerActivity 並關閉登入頁。這個檔案本身不修改資料庫,但它是進入管理者資料維護功能的入口,因此後面要觀察管理者修改資料是否會被 CSV 重新匯入覆蓋。
進入管理者功能主線時,我先讀了 LoginActivity。這個檔案的角色很清楚:它是管理者功能的守門員。使用者從首頁按下 Manage 後,會進入登入頁,輸入帳號與密碼,通過驗證後才會進入 ManagerActivity。
這裡也出現了第一個管理者功能的技術債:帳號和密碼直接硬編碼在 App 裡。對課堂專案或展示來說可以理解,但如果是正式產品,這樣的做法不安全,也不方便管理多個帳號或權限。
另一個值得追下去的點是登入成功後會寫入 isLoggedIn = true,所以後面需要檢查 ManagerActivity 是否真的有驗證登入狀態,以及是否有登出機制。
一句話重點總結:
LoginActivity是管理者功能的入口守門員,負責驗證帳密、記錄登入狀態,並在成功後跳到ManagerActivity。
介紹完管理者功能的入口之後,雖然內容比較簡單,但有一點缺陷需要調整。
下一個我們會正式進入到管理者選項頁面-ManagerActivity.kt,登入成功後進入的管理者主頁提供哪些功能入口?
其中和登入系統中有很大的相關聯是 有沒有檢查 isLoggedIn?以及 **有沒有登出機制?**下一篇我們會來揭曉這層面紗。